home *** CD-ROM | disk | FTP | other *** search
/ Otherware / Otherware_1_SB_Development.iso / mac / hypercar / mactool / thinkcgu.sit / app ƒ / dfile.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-02-27  |  5.7 KB  |  252 lines

  1. /*
  2. *    FILE:        dfile.c
  3. *    AUTHOR:        R. Gonzalez
  4. *    CREATED:    January 30, 1991
  5. *
  6. *    Defines simple database file access methods.
  7. */
  8.  
  9. # include    "dfile.h"
  10. # include    <stdlib.h>
  11. # include    <string.h>
  12. # include    <stdio.h>
  13. # include    "morestr.h"
  14.  
  15. # define    MAX_LENGTH    80
  16.  
  17. /************************************************************************
  18. *    initialize
  19. ************************************************************************/
  20. boolean    Dfile::init(void)
  21. {
  22.     filename = NULL;
  23.     num_data = 0;
  24.     
  25.     return TRUE;
  26. }
  27.  
  28. /************************************************************************
  29. *    open existing file
  30. ************************************************************************/
  31. boolean    Dfile::open_existing(char *filename_val)
  32. {
  33.     boolean    success;
  34.     int        temp_int,
  35.             i;
  36.     char    temp_char[MAX_LENGTH],
  37.             junk;
  38.     FILE    *file;
  39.     
  40.     if ((file = fopen(filename_val,"r")) == NULL)
  41.         success = FALSE;
  42.     else
  43.     {
  44.         success = TRUE;
  45.         destroy();
  46.         init();
  47.         /* is it right that Turbo C++ requires me to cast malloc's
  48.             return value here and later in this file? */
  49.         filename = (char*) malloc(sizeof(char) * (strlen(filename_val)+1));
  50.         strcpy(filename,filename_val);
  51.         fscanf(file,"%d",&temp_int);
  52.         junk = fgetc(file);
  53.         num_data = temp_int;    /* "shadowing" for Think C */
  54.         for (i=0 ; i<num_data ; i++)
  55.         {
  56.             get_line(file,temp_char,MAX_LENGTH);
  57.             name[i] = (char*) malloc(sizeof(char) * (strlen(temp_char)+1));
  58.             strcpy(name[i],temp_char);
  59.             get_line(file,temp_char,MAX_LENGTH);
  60.             age[i] = (char*) malloc(sizeof(char) * (strlen(temp_char)+1));
  61.             strcpy(age[i],temp_char);
  62.         }
  63.         fclose(file);
  64.     }
  65.     
  66.     return success;
  67. }
  68.  
  69. /************************************************************************
  70. *    write to a valid file
  71. ************************************************************************/
  72. boolean    Dfile::write_valid(char *filename_val)
  73. {
  74.     int        i;
  75.     FILE    *file;
  76.     boolean    success;
  77.     
  78.     if (strcmp(filename_val,"") != 0)
  79.     {
  80.         file = fopen(filename_val,"w");
  81.         if (filename != NULL)
  82.             free(filename);
  83.         filename = (char*) malloc(sizeof(char) * (strlen(filename_val)+1));
  84.         strcpy(filename,filename_val);
  85.     }
  86.     else
  87.     {
  88.         if (filename != NULL)
  89.             file = fopen(filename,"w");
  90.         else
  91.             file = NULL;
  92.     }
  93.             
  94.     if (file == NULL)
  95.         success = FALSE;
  96.     else
  97.     {
  98.         success = TRUE;
  99.         fprintf(file,"%d\n",num_data);
  100.         for (i=0 ; i<num_data ; i++)
  101.         {
  102.             fprintf(file,"%s\n",name[i]);
  103.             fprintf(file,"%s\n",age[i]);
  104.         }
  105.         
  106.         fclose(file);
  107.     }
  108.     
  109.     return success;
  110. }
  111.  
  112. /************************************************************************
  113. *    add a record
  114. ************************************************************************/
  115. boolean    Dfile::add_record(char *name_val,char *age_val)
  116. {
  117.     boolean    success;
  118.     
  119.     if (num_data+1 < MAX_DATA)
  120.     {
  121.         success = TRUE;
  122.         name[num_data] = (char*) malloc(sizeof(char) * (strlen(name_val)+1));
  123.         strcpy(name[num_data],name_val);
  124.         age[num_data] = (char*) malloc(sizeof(char) * (strlen(age_val)+1));
  125.         strcpy(age[num_data],age_val);
  126.         num_data++;
  127.     }
  128.     else
  129.         success = FALSE;
  130.     
  131.     return success;
  132. }
  133.  
  134. /************************************************************************
  135. *    get a record
  136. ************************************************************************/
  137. boolean    Dfile::get_record(int record_no,char *record)
  138. {
  139.     boolean    success;
  140.     
  141.     if (record_no >= num_data)
  142.         success = FALSE;
  143.     else
  144.     {
  145.         success = TRUE;
  146.         strcpy(record,name[record_no]);
  147.         strcat(record,", ");
  148.         strcat(record,age[record_no]);
  149.     }
  150.     
  151.     return success;
  152. }
  153.  
  154. /************************************************************************
  155. *    sort database by name
  156. ************************************************************************/
  157. boolean    Dfile::sort_by_name(void)
  158. {
  159.     int        i,
  160.             j;
  161.     char    temp[MAX_LENGTH];
  162.     
  163.     for (i=0 ; i<num_data ; i++)
  164.         for (j=i ; j<num_data ; j++)
  165.         {
  166.             if (strcmp(name[i],name[j]) > 0)
  167.             {
  168.                 strcpy(temp,name[i]);
  169.                 free(name[i]);
  170.                 name[i] = (char*) malloc(sizeof(char) * (strlen(name[j])+1));
  171.                 strcpy(name[i],name[j]);
  172.                 free(name[j]);
  173.                 name[j] = (char*) malloc(sizeof(char) * (strlen(temp)+1));
  174.                 strcpy(name[j],temp);
  175.                 strcpy(temp,age[i]);
  176.                 free(age[i]);
  177.                 age[i] = (char*) malloc(sizeof(char) * (strlen(age[j])+1));
  178.                 strcpy(age[i],age[j]);
  179.                 free(age[j]);
  180.                 age[j] = (char*) malloc(sizeof(char) * (strlen(temp)+1));
  181.                 strcpy(age[j],temp);
  182.             }
  183.         }
  184.     
  185.     return TRUE;
  186. }
  187.  
  188. /************************************************************************
  189. *    sort database by age
  190. ************************************************************************/
  191. boolean    Dfile::sort_by_age(void)
  192. {
  193.     int        i,
  194.             j;
  195.     char    temp[MAX_LENGTH];
  196.     
  197.     for (i=0 ; i<num_data ; i++)
  198.         for (j=i ; j<num_data ; j++)
  199.         {
  200.             if (strtoint(age[i]) > strtoint(age[j]))
  201.             {
  202.                 strcpy(temp,name[i]);
  203.                 free(name[i]);
  204.                 name[i] = (char*) malloc(sizeof(char) * (strlen(name[j])+1));
  205.                 strcpy(name[i],name[j]);
  206.                 free(name[j]);
  207.                 name[j] = (char*) malloc(sizeof(char) * (strlen(temp)+1));
  208.                 strcpy(name[j],temp);
  209.                 strcpy(temp,age[i]);
  210.                 free(age[i]);
  211.                 age[i] = (char*) malloc(sizeof(char) * (strlen(age[j])+1));
  212.                 strcpy(age[i],age[j]);
  213.                 free(age[j]);
  214.                 age[j] = (char*) malloc(sizeof(char) * (strlen(temp)+1));
  215.                 strcpy(age[j],temp);
  216.             }
  217.         }
  218.     
  219.     return TRUE;
  220. }
  221.  
  222. /************************************************************************
  223. *    show name - we need the app_ptr in order to use query() or respond()!
  224. ************************************************************************/
  225. void    Dfile::show_name(Test_App *app_ptr)
  226. {
  227.     if (filename == NULL)
  228.         app_ptr->respond("No name.");
  229.     else
  230.         app_ptr->respond(filename);
  231. }
  232.  
  233. /************************************************************************
  234. *    destroy
  235. ************************************************************************/
  236. boolean    Dfile::destroy(void)
  237. {
  238.     int        i;
  239.     
  240.     for (i=0 ; i<num_data ; i++)
  241.     {
  242.         free(name[i]);
  243.         free(age[i]);
  244.     }
  245.     
  246.     if (filename != NULL)
  247.         free(filename);
  248.     
  249.     return TRUE;
  250. }
  251.  
  252.